GdkDevice *device;
GtkWidget *widget;
GtkWindow *window;
- GdkWindow *relative_to;
cairo_rectangle_int_t pointing_to;
gint win_x;
gint win_y;
switch (prop_id)
{
case PROP_RELATIVE_TO:
- g_value_set_object (value, priv->relative_to);
+ g_value_set_object (value, priv->widget);
break;
case PROP_POINTING_TO:
g_value_set_boxed (value, &priv->pointing_to);
gtk_bubble_window_finalize (GObject *object)
{
GtkBubbleWindow *window = GTK_BUBBLE_WINDOW (object);
- GtkBubbleWindowPrivate *priv = window->priv;
_gtk_bubble_window_popdown (window);
- if (priv->relative_to)
- g_object_unref (priv->relative_to);
-
G_OBJECT_CLASS (_gtk_bubble_window_parent_class)->finalize (object);
}
g_param_spec_object ("relative-to",
P_("Relative to"),
P_("Window the bubble window points to"),
- GDK_TYPE_WINDOW,
+ GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_POINTING_TO,
static void
gtk_bubble_window_update_relative_to (GtkBubbleWindow *window,
- GdkWindow *relative_to)
+ GtkWidget *relative_to)
{
GtkBubbleWindowPrivate *priv;
priv = window->priv;
- if (priv->relative_to == relative_to)
+ if (priv->widget == relative_to)
return;
- if (priv->relative_to)
- g_object_unref (priv->relative_to);
-
if (priv->window)
{
gtk_window_remove_popover (priv->window, GTK_WIDGET (window));
priv->window = NULL;
}
- priv->relative_to = (relative_to) ? g_object_ref (relative_to) : NULL;
+ priv->widget = relative_to;
g_object_notify (G_OBJECT (window), "relative-to");
- if (priv->relative_to)
- {
- gdk_window_get_user_data (priv->relative_to, (gpointer*) &priv->widget);
- priv->window =
- GTK_WINDOW (gtk_widget_get_ancestor (priv->widget, GTK_TYPE_WINDOW));
- }
- else
- {
- priv->window = NULL;
- priv->widget = NULL;
- }
+ if (priv->widget)
+ priv->window =
+ GTK_WINDOW (gtk_widget_get_ancestor (priv->widget, GTK_TYPE_WINDOW));
if (priv->window)
gtk_window_add_popover (priv->window, GTK_WIDGET (window));
* Since: 3.8
*/
GtkWidget *
-_gtk_bubble_window_new (void)
+_gtk_bubble_window_new (GtkWidget *relative_to)
{
- return g_object_new (GTK_TYPE_BUBBLE_WINDOW, NULL);
+ return g_object_new (GTK_TYPE_BUBBLE_WINDOW,
+ "relative-to", relative_to,
+ NULL);
}
/*
*/
void
_gtk_bubble_window_set_relative_to (GtkBubbleWindow *window,
- GdkWindow *relative_to)
+ GtkWidget *relative_to)
{
g_return_if_fail (GTK_IS_BUBBLE_WINDOW (window));
- g_return_if_fail (!relative_to || GDK_IS_WINDOW (relative_to));
+ g_return_if_fail (GTK_IS_WIDGET (relative_to));
gtk_bubble_window_update_relative_to (window, relative_to);
*
* Since: 3.8
*/
-GdkWindow *
+GtkWidget *
_gtk_bubble_window_get_relative_to (GtkBubbleWindow *window)
{
GtkBubbleWindowPrivate *priv;
priv = window->priv;
- return priv->relative_to;
+ return priv->widget;
}
/*
*/
void
_gtk_bubble_window_popup (GtkBubbleWindow *window,
- GdkWindow *relative_to,
+ GtkWidget *relative_to,
cairo_rectangle_int_t *pointing_to,
GtkPositionType position)
{
g_return_if_fail (GTK_IS_BUBBLE_WINDOW (window));
- g_return_if_fail (!relative_to || GDK_IS_WINDOW (relative_to));
+ g_return_if_fail (GTK_IS_WIDGET (relative_to));
g_return_if_fail (position >= GTK_POS_LEFT && position <= GTK_POS_BOTTOM);
g_return_if_fail (pointing_to != NULL);
void
_gtk_bubble_window_popdown (GtkBubbleWindow *window)
{
- GtkBubbleWindowPrivate *priv = window->priv;
-
g_return_if_fail (GTK_IS_BUBBLE_WINDOW (window));
if (gtk_widget_get_visible (GTK_WIDGET (window)))
GType _gtk_bubble_window_get_type (void) G_GNUC_CONST;
-GtkWidget * _gtk_bubble_window_new (void);
+GtkWidget * _gtk_bubble_window_new (GtkWidget *relative_to);
-void _gtk_bubble_window_set_relative_to (GtkBubbleWindow *window,
- GdkWindow *relative_to);
-GdkWindow * _gtk_bubble_window_get_relative_to (GtkBubbleWindow *window);
+void _gtk_bubble_window_set_relative_to (GtkBubbleWindow *window,
+ GtkWidget *relative_to);
+GtkWidget * _gtk_bubble_window_get_relative_to (GtkBubbleWindow *window);
void _gtk_bubble_window_set_pointing_to (GtkBubbleWindow *window,
cairo_rectangle_int_t *rect);
_gtk_bubble_window_get_position (GtkBubbleWindow *window);
void _gtk_bubble_window_popup (GtkBubbleWindow *window,
- GdkWindow *relative_to,
+ GtkWidget *relative_to,
cairo_rectangle_int_t *pointing_to,
GtkPositionType position);
GtkEntry *entry = user_data;
GtkEntryPrivate *priv = entry->priv;
cairo_rectangle_int_t rect;
- GtkAllocation allocation;
+ GtkAllocation allocation, primary, secondary;
gint start_x, end_x;
gboolean has_selection;
gboolean has_clipboard;
if (priv->selection_bubble)
gtk_widget_destroy (priv->selection_bubble);
- priv->selection_bubble = _gtk_bubble_window_new ();
+ priv->selection_bubble = _gtk_bubble_window_new (GTK_WIDGET (entry));
toolbar = GTK_WIDGET (gtk_toolbar_new ());
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_TEXT);
gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), FALSE);
start_x -= priv->scroll_offset;
start_x = CLAMP (start_x, 0, gdk_window_get_width (priv->text_area));
- rect.y = 0;
+ gtk_entry_get_text_area_size (entry, &rect.x, &rect.y, NULL, NULL);
+ get_icon_allocations (entry, &primary, &secondary);
+ rect.x += primary.width;
rect.height = gdk_window_get_height (priv->text_area);
if (has_selection)
end_x = gtk_entry_get_selection_bound_location (entry) - priv->scroll_offset;
end_x = CLAMP (end_x, 0, gdk_window_get_width (priv->text_area));
- rect.x = MIN (start_x, end_x);
- rect.width = MAX (start_x, end_x) - rect.x;
+ rect.x += MIN (start_x, end_x);
+ rect.width = MAX (start_x, end_x) - MIN (start_x, end_x);
}
else
{
- rect.x = start_x;
+ rect.x += start_x;
rect.width = 0;
}
_gtk_bubble_window_popup (GTK_BUBBLE_WINDOW (priv->selection_bubble),
- priv->text_area, &rect, GTK_POS_TOP);
+ GTK_WIDGET (entry), &rect, GTK_POS_TOP);
priv->selection_bubble_timeout_id = 0;
}
gboolean can_insert;
GtkTextIter iter;
GtkTextIter sel_start, sel_end;
- GdkWindow *window;
GtkWidget *toolbar;
has_selection = gtk_text_buffer_get_selection_bounds (get_buffer (text_view),
if (priv->selection_bubble)
gtk_widget_destroy (priv->selection_bubble);
- window = gtk_widget_get_window (GTK_WIDGET (text_view));
- priv->selection_bubble = _gtk_bubble_window_new ();
+ priv->selection_bubble = _gtk_bubble_window_new (GTK_WIDGET (text_view));
toolbar = GTK_WIDGET (gtk_toolbar_new ());
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_TEXT);
gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), FALSE);
rect.x -= priv->xoffset;
rect.y -= priv->yoffset;
_gtk_bubble_window_popup (GTK_BUBBLE_WINDOW (priv->selection_bubble),
- window, &rect, GTK_POS_TOP);
+ GTK_WIDGET (text_view), &rect, GTK_POS_TOP);
priv->selection_bubble_timeout_id = 0;
}